package ru.bytedog.oiot.counter.bot.service.command;

import org.springframework.stereotype.Service;
import org.telegram.telegrambots.meta.api.objects.Message;
import ru.bytedog.oiot.counter.bot.bean.BotAnswer;
import ru.bytedog.oiot.counter.bot.bean.RegisterUserResult;
import ru.bytedog.oiot.counter.bot.entity.BotUser;
import ru.bytedog.oiot.counter.bot.service.OiotIntegrationService;
import ru.bytedog.oiot.counter.bot.service.RegisterUserService;
import ru.bytedog.oiot.counter.bot.service.RegisterUserStep;

/**
 * Обработка текстового сообщения пользователя
 * В логике сервиса аналагична обработке команды /start,
 * если пользователь не прошел полную регистрацию,
 * иначе выполняется запрос данных в сервис OIOT.RU
 */
@Service
public class TextCommand implements BotCommand {

    protected final RegisterUserService service;
    private final OiotIntegrationService oiotService;

    public TextCommand(RegisterUserService service, OiotIntegrationService oiotService) {
        this.service = service;
        this.oiotService = oiotService;
    }

    @Override
    public CommandEnum getCommand() {
        return CommandEnum.ADD;
    }

    @Override
    public BotAnswer commandProcess(Message message) {
        BotUser botUser = getUser(message);
        RegisterUserResult registrationResult = service.checkAndRegister(botUser, getRegistrationText(message), message.getMessageId());
        if (isOnlyRegistration() || registrationResult.getUser().getStep() != RegisterUserStep.USER_ADDED) {
            return getRegistrationAnswer(registrationResult);
        }
        return new BotAnswer(oiotService.loadUserLastCounterValue(registrationResult.getUser()).getBotMessage(),
                botUser.getChatId(), registrationResult.getDeleteMessageId());
    }

    /**
     * Получить ответ бота при не завершенной регистрации пользователя
     *
     * @param registrationResult информация о регистрации
     * @return ответ бота
     */
    protected BotAnswer getRegistrationAnswer(RegisterUserResult registrationResult) {
        BotUser botUser = registrationResult.getUser();
        return new BotAnswer(String.format(getMessageTemplate(registrationResult),
                botUser.getFirstName(), botUser.getLastName()),
                botUser.getChatId(), registrationResult.getDeleteMessageId());
    }

    /**
     * Необходима только проверка/регистрация пользователя, без запроса данных
     *
     * @return true - только регистрация
     */
    protected boolean isOnlyRegistration() {
        return false;
    }

    /**
     * Текст сообщения для регистрации
     *
     * @param message информация о сообщении пользователя
     * @return текст сообщения
     */
    protected String getRegistrationText(Message message) {
        return message.getText();
    }

    /**
     * Получение из сообщения данных необходимых для сервиса
     *
     * @param message информация о сообщении пользователя
     * @return пользователь сервиса
     */
    protected BotUser getUser(Message message) {
        BotUser user = new BotUser();
        user.setChatId(message.getChatId());
        user.setFirstName(message.getFrom().getFirstName());
        user.setLastName(message.getFrom().getLastName());
        user.setUserName(message.getFrom().getUserName());
        return user;
    }

    private String getMessageTemplate(RegisterUserResult registrationResult) {
        // Для нового пользователя добавляется приветственное слово
        if (registrationResult.isNewUser()) {
            return RegisterUserStep.NEW_USER.getMessageTemplate() + registrationResult.getUser().getStep().getMessageTemplate();
        }
        return registrationResult.getUser().getStep().getMessageTemplate();
    }

}
